import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

/**
 * 用户认证状态管理
 */
export const useAuthStore = defineStore('auth', () => {
  // 从 localStorage 恢复用户信息
  const storedUser = localStorage.getItem('user')

  // 状态
  const user = ref(storedUser ? JSON.parse(storedUser) : null)
  const token = ref(localStorage.getItem('access_token') || null)
  const tokenExpiresAt = ref(localStorage.getItem('token_expires_at') ? parseInt(localStorage.getItem('token_expires_at')) : null)

  // 计算属性 - 检查 token 是否存在且未过期
  const isLoggedIn = computed(() => {
    if (!token.value) return false
    if (!tokenExpiresAt.value) return false
    return Date.now() < tokenExpiresAt.value
  })

  /**
   * 检查 token 是否过期
   */
  const isTokenExpired = () => {
    if (!token.value || !tokenExpiresAt.value) return true
    return Date.now() >= tokenExpiresAt.value
  }

  /**
   * 设置用户信息
   */
  const setUser = (userInfo) => {
    user.value = userInfo
    if (userInfo) {
      localStorage.setItem('user', JSON.stringify(userInfo))
    } else {
      localStorage.removeItem('user')
    }
  }

  /**
   * 设置 token 和过期时间
   */
  const setToken = (accessToken, expiresIn = null) => {
    token.value = accessToken
    if (accessToken) {
      localStorage.setItem('access_token', accessToken)

      // 如果提供了过期时间(秒),计算并保存过期时间戳
      if (expiresIn) {
        const expiresAt = Date.now() + expiresIn * 1000
        tokenExpiresAt.value = expiresAt
        localStorage.setItem('token_expires_at', expiresAt.toString())
      }
    } else {
      localStorage.removeItem('access_token')
      localStorage.removeItem('token_expires_at')
      tokenExpiresAt.value = null
    }
  }

  /**
   * 登录
   */
  const login = (accessToken, userInfo, expiresIn = null) => {
    setToken(accessToken, expiresIn)
    setUser(userInfo)
  }

  /**
   * 登出
   */
  const logout = () => {
    setToken(null)
    setUser(null)
  }

  /**
   * 更新用户信息
   */
  const updateUser = (userInfo) => {
    if (user.value) {
      user.value = { ...user.value, ...userInfo }
      // 同步更新 localStorage
      localStorage.setItem('user', JSON.stringify(user.value))
    }
  }

  return {
    // 状态
    user,
    token,
    tokenExpiresAt,
    isLoggedIn,

    // 方法
    setUser,
    setToken,
    login,
    logout,
    updateUser,
    isTokenExpired
  }
})